package com.finch.juc;

import java.util.concurrent.TimeUnit;

/**
 * @author Levi Wang
 * @create 2021-07-07 23:46
 *
 * 题目：多线程8锁
 *1 标准访问，请问是先打印邮件还是短信？
 * 2 邮件方法暂停4秒钟，请问先打印邮件还是短信？
 * 先打印邮件；因为A线程先进去，所以B被阻塞
 *
 * 3 新增一个普通方法hello(), 请问先打印邮件还是hello
 *先打印hello
 *
 * 4  两部手机，先打印邮件还是短信
 *
 *
 * 5  两个静态同步方法，同一部手机，请问先打印邮件还是hello？
 *
 * 6  两个静态同步方法，两部手机，请问先打印邮件还是hello？
 *
 *7  1个普通同步方法，1个静态同步方法，1部手机，请问先打印邮件还是hello？
 *
 *8 1个普通同步方法，1个静态同步方法，2部手机，请问先打印邮件还是hello？
 *
 *
 *讲解：
 * synchronized修饰方法，内置对象是this，也就是说，同一时间段内，只能有一个线程进入这个资源类的某一个sync方法，，所以类里其他sync方法也被锁上，
 * 但是普通方法还可以被其他线程访问
 *
 * 加了static之后，两部手机也没用，因为锁的是这个类，没加static之前锁的是这个类的某个实例对象；
 * 静态方法的虚拟机栈中的局部变量表中没有this，this是与某个实例对象的；
 *
 * 对于同步方法块，锁的是括号里配置的对象
 *
 */

class Phone{

    public  synchronized void sendEmail() throws Exception{
        //让打印邮件暂停4秒钟，也可以用Thread.sleep(4000)
        try {
            TimeUnit.SECONDS.sleep(4);//进源码看一下
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("--------sendEmail");
    }

    public static synchronized void sendSMS() throws Exception{
        System.out.println("--------sendSMS");
    }

    public void hello(){
        System.out.println("--------hello");
    }

}



public class Lock8 {

    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        Phone phone2 = new Phone();

        new Thread(() -> {
            try {
                phone.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "A").start();

        Thread.sleep(100); //保证A线程先执行，B线程后执行

        new Thread(() -> {
            try {
                phone2.sendSMS();
//                phone.hello();
//                phone.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }, "B").start();

//        new Thread(() -> {
//            try {
//
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }, "C").start();

    }
}












